package my.simplecalculator;

import java.util.*;
import java.util.regex.*;
import iusis.util.*;
import iusis.util.Tools.OpStat;
import iusis.util.Tools.Stat;

public class CalculatorWithWord{
	String p, q, r;
	boolean bPoint;
	public String result;			// 계산 식, 계산값	
	public CalculatorWithWord() {
		super();
		bPoint=false;
		p="";
		q="";
		r="";
		init();
	}


	/**
	 * 멤버를 초기화
	 */
	protected void init(){
		result="";
	}

	/**
	 * 계산 결과를 반환
	 */
	private String compute(double leftVal, Tools.OpStat op, double rightVal)
	{
		Double result = 0.0;
		switch(op){
		case plus:		
			result = leftVal+rightVal;
			break;
		case minus:		
			result = leftVal-rightVal;
			break;
		case multiply:		
			result = leftVal*rightVal;
			break;
		case divide:		
			result = leftVal/rightVal;
			break;
		}

		return String.valueOf(result);
	}



	//////////////////
	// public method 
	//	
	/**
	 * 단어 단위로 입력값을 받아 lvalue나 rvalue나 op 에 할당
	 * void addWord(String word)
	 * @param word
	 */	

	public void addWord(String word) {
		Stat pStat = Tools.whichStat(p);
		Stat qStat = Tools.whichStat(q);
		Stat rStat = Tools.whichStat(r);
		Stat tmpStat = Tools.whichStat(word);

		if(tmpStat==Stat.undefinedStat) return;


//		System.out.println(String.format("%15s %15s %15s %15s(%s)", pStat,qStat,rStat,tmpStat, word));
//		System.out.println(String.format("%15s %15s %15s %15s", p,q,r,word));

		if(pStat==Stat.number && qStat==Stat.op && rStat==Stat.number && tmpStat==Stat.op){
			result = compute(Double.valueOf(p), Tools.whichOp(q), Double.valueOf(r));
//			System.out.println("계산가능한 식이 만들어짐"+result);

			p="";
			q="";
			r=result;			
		}

		if(tmpStat != rStat) {
			if(rStat==Stat.number && tmpStat==Stat.point){	
				bPoint=true;
				r+=word;
			}else if(bPoint){
				bPoint=false;
				r+=word;
			}
			else{
				p = q;
				q = r;
				r = word;				
			}
		}else {
			if(tmpStat==Stat.number) 
				r += word;
			else if(tmpStat!=Stat.point){
				r = word;
			}
		}
	}//
}// end-of-class


//	/**
//	 * 입력된 식을 계산하여 result에 할당
//	 */
//	private void addWord(String word){
		//		Stat pStat = whichStat(p);
		//		Stat qStat = whichStat(q);
		//		Stat rStat = whichStat(r);
		//		Stat tmpStat = whichStat(word);
		//		
		//		if(tmpStat==Stat.undefinedStat) return;
		//		
		//		
		//		System.out.println(String.format("%15s %15s %15s %15s(%s)", pStat,qStat,rStat,tmpStat, word));
		//		System.out.println(String.format("%15s %15s %15s %15s", p,q,r,word));
		//		System.out.println(String.format("%s = %s",expr,result));
		//		
		//		if(pStat==Stat.number && qStat==Stat.op && rStat==Stat.number && tmpStat==Stat.op){
		//			expr += p+q+r;
		//			result = compute(Double.valueOf(p), whichOp(q), Double.valueOf(r));
		//			System.out.println("계산가능한 식이 만들어짐"+result);
		//			
		//			p="";
		//			q="";
		//			r=result;			
		//		}
		//		
		//		if(tmpStat != rStat) {
		//			if(rStat==Stat.number && tmpStat==Stat.point){	
		//				bPoint=true;
		//				r+=word;
		//			}else if(bPoint){
		//				bPoint=false;
		//				r+=word;
		//			}
		//			else{
		//				p = q;
		//				q = r;
		//				r = word;				
		//			}
		//		}else {
		//			if(tmpStat==Stat.number) 
		//				r += word;
		//			else if(tmpStat!=Stat.point){
		//				r = word;
		//			}
		//		}
//	}



